#!/usr/bin/env python
"""
初始化数据脚本
用于创建默认的角色、权限和管理员用户
"""

import os
import sys
import django
from datetime import datetime

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'moveproduct.settings')
django.setup()

from user.models import User, Role, UserRole, Permission
from user.decorators import PERMISSIONS, ROLES
from django.contrib.auth.hashers import make_password


def create_default_permissions():
    """创建默认权限"""
    print("正在创建默认权限...")
    
    permissions_data = [
        # 用户管理权限
        {'name': '查看用户', 'code': PERMISSIONS['USER_VIEW'], 'description': '查看用户信息', 'module': 'user'},
        {'name': '创建用户', 'code': PERMISSIONS['USER_CREATE'], 'description': '创建新用户', 'module': 'user'},
        {'name': '更新用户', 'code': PERMISSIONS['USER_UPDATE'], 'description': '更新用户信息', 'module': 'user'},
        {'name': '删除用户', 'code': PERMISSIONS['USER_DELETE'], 'description': '删除用户', 'module': 'user'},
        
        # 图书管理权限
        {'name': '查看图书', 'code': PERMISSIONS['BOOK_VIEW'], 'description': '查看图书信息', 'module': 'book'},
        {'name': '创建图书', 'code': PERMISSIONS['BOOK_CREATE'], 'description': '创建新图书', 'module': 'book'},
        {'name': '更新图书', 'code': PERMISSIONS['BOOK_UPDATE'], 'description': '更新图书信息', 'module': 'book'},
        {'name': '删除图书', 'code': PERMISSIONS['BOOK_DELETE'], 'description': '删除图书', 'module': 'book'},
        
        # 借阅管理权限
        {'name': '查看借阅记录', 'code': PERMISSIONS['BORROW_VIEW'], 'description': '查看借阅记录', 'module': 'borrow'},
        {'name': '借阅图书', 'code': PERMISSIONS['BORROW_CREATE'], 'description': '借阅图书', 'module': 'borrow'},
        {'name': '归还图书', 'code': PERMISSIONS['BORROW_UPDATE'], 'description': '归还图书', 'module': 'borrow'},
        
        # 角色管理权限
        {'name': '查看角色', 'code': PERMISSIONS['ROLE_VIEW'], 'description': '查看角色信息', 'module': 'role'},
        {'name': '创建角色', 'code': PERMISSIONS['ROLE_CREATE'], 'description': '创建新角色', 'module': 'role'},
        {'name': '更新角色', 'code': PERMISSIONS['ROLE_UPDATE'], 'description': '更新角色信息', 'module': 'role'},
        {'name': '删除角色', 'code': PERMISSIONS['ROLE_DELETE'], 'description': '删除角色', 'module': 'role'},
        
        # 权限管理权限
        {'name': '查看权限', 'code': PERMISSIONS['PERMISSION_VIEW'], 'description': '查看权限信息', 'module': 'permission'},
        {'name': '创建权限', 'code': PERMISSIONS['PERMISSION_CREATE'], 'description': '创建新权限', 'module': 'permission'},
        {'name': '更新权限', 'code': PERMISSIONS['PERMISSION_UPDATE'], 'description': '更新权限信息', 'module': 'permission'},
        {'name': '删除权限', 'code': PERMISSIONS['PERMISSION_DELETE'], 'description': '删除权限', 'module': 'permission'},
    ]
    
    for perm_data in permissions_data:
        Permission.objects.get_or_create(
            code=perm_data['code'],
            defaults=perm_data
        )
    
    print(f"成功创建 {len(permissions_data)} 个权限")


def create_default_roles():
    """创建默认角色"""
    print("正在创建默认角色...")
    
    # 管理员角色（拥有所有权限）
    admin_role, created = Role.objects.get_or_create(
        name=ROLES['ADMIN'],
        defaults={
            'description': '系统管理员，拥有所有权限',
            'permissions': list(PERMISSIONS.values())
        }
    )
    if created:
        print(f"创建管理员角色: {admin_role.name}")
    
    # 图书管理员角色
    librarian_permissions = [
        PERMISSIONS['BOOK_VIEW'], PERMISSIONS['BOOK_CREATE'], PERMISSIONS['BOOK_UPDATE'], PERMISSIONS['BOOK_DELETE'],
        PERMISSIONS['BORROW_VIEW'], PERMISSIONS['BORROW_CREATE'], PERMISSIONS['BORROW_UPDATE'],
        PERMISSIONS['USER_VIEW']
    ]
    
    librarian_role, created = Role.objects.get_or_create(
        name=ROLES['LIBRARIAN'],
        defaults={
            'description': '图书管理员，负责图书和借阅管理',
            'permissions': librarian_permissions
        }
    )
    if created:
        print(f"创建图书管理员角色: {librarian_role.name}")
    
    # 普通用户角色
    user_permissions = [
        PERMISSIONS['BOOK_VIEW'],
        PERMISSIONS['BORROW_VIEW'], PERMISSIONS['BORROW_CREATE'], PERMISSIONS['BORROW_UPDATE']
    ]
    
    user_role, created = Role.objects.get_or_create(
        name=ROLES['USER'],
        defaults={
            'description': '普通用户，可以查看图书和借阅',
            'permissions': user_permissions
        }
    )
    if created:
        print(f"创建普通用户角色: {user_role.name}")
    
    print("默认角色创建完成")


def create_admin_user():
    """创建管理员用户"""
    print("正在创建管理员用户...")
    
    # 检查是否已存在管理员用户
    if User.objects.filter(username='admin').exists():
        print("管理员用户已存在")
        return
    
    # 创建管理员用户
    admin_user = User.objects.create(
        username='admin',
        password=make_password('admin123'),
        email='admin@example.com',
        status=0,
        create_time=datetime.now().date(),
        update_time=datetime.now().date()
    )
    
    # 分配管理员角色
    admin_role = Role.objects.get(name=ROLES['ADMIN'])
    UserRole.objects.create(user=admin_user, role=admin_role)
    
    print(f"成功创建管理员用户: {admin_user.username}")
    print("管理员登录信息:")
    print("用户名: admin")
    print("密码: admin123")


def create_sample_books():
    """创建示例图书"""
    print("正在创建示例图书...")
    
    sample_books = [
        {
            'title': 'Python编程从入门到实践',
            'author': 'Eric Matthes',
            'description': 'Python编程的经典入门教材，适合初学者学习',
            'stock': 10,
            'category': '编程'
        },
        {
            'title': 'Django Web开发指南',
            'author': 'Adrian Holovaty',
            'description': 'Django框架的权威指南，涵盖Web开发各个方面',
            'stock': 8,
            'category': '编程'
        },
        {
            'title': '算法导论',
            'author': 'Thomas H. Cormen',
            'description': '计算机算法的经典教材，深入浅出地讲解各种算法',
            'stock': 5,
            'category': '计算机科学'
        },
        {
            'title': '设计模式',
            'author': 'Erich Gamma',
            'description': '软件设计模式的经典著作，23种设计模式的详细讲解',
            'stock': 6,
            'category': '软件工程'
        },
        {
            'title': '深入理解计算机系统',
            'author': 'Randal E. Bryant',
            'description': '计算机系统的经典教材，从程序员的角度理解计算机',
            'stock': 7,
            'category': '计算机科学'
        }
    ]
    
    from user.models import Book
    
    for book_data in sample_books:
        book, created = Book.objects.get_or_create(
            title=book_data['title'],
            author=book_data['author'],
            defaults=book_data
        )
        if created:
            print(f"创建图书: {book.title}")
    
    print(f"成功创建 {len(sample_books)} 本示例图书")


def main():
    """主函数"""
    print("开始初始化数据...")
    
    try:
        # 创建默认权限
        create_default_permissions()
        
        # 创建默认角色
        create_default_roles()
        
        # 创建管理员用户
        create_admin_user()
        
        # 创建示例图书
        create_sample_books()
        
        print("\n数据初始化完成！")
        print("\n系统信息:")
        print("- 管理员账号: admin / admin123")
        print("- 默认角色: admin(管理员), librarian(图书管理员), user(普通用户)")
        print("- 示例图书: 5本编程和计算机科学相关图书")
        
    except Exception as e:
        print(f"初始化过程中出现错误: {e}")
        sys.exit(1)


if __name__ == '__main__':
    main() 